package cn.fl.flow.service;

import java.util.List;

import cmm.flowweb.core.cmm.flow.service.impl.ICmmFlowAbstractApiService;
import cmm.mid.core.framework.dto.DataResultDTO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cmm.user.facade.system.dto.SysUsrFunAuthRDTO;
import cn.cmm.base.framework.exception.BaseException;
import cn.fl.flow.vo.FlowTaskInfoVO;
import cn.fl.flow.vo.SysFlowAgentUsrVO;
import cn.fl.framework.base.context.CurrentThreadContext;
import cn.fl.system.vo.SysFlowManageVVO;
import cn.fl.system.vo.SysFlowTaskHVO;
import fl.flow.facade.flow.condition.SysFlowManageVQueryCondition;
import fl.flow.facade.flow.dto.FlowCompleteParamsDTO;
import fl.flow.facade.flow.dto.FlowProcessDTO;

/**
 * @Description: 我的任务客户端服务层接口
 * @Description: 业务层方法名称前缀： 新增：add* 删除：remove* 修改：modify* 查询对象：select* get* 查询集合：search*
 */
public interface IFlowService extends ICmmFlowAbstractApiService{

	/**
	 * 根据用主键及分页参数获取工作流中我的待办任务及挂起任务
	 * @param page 当前页,每页数量,起始索引
	 * @param userId 用户ID
	 * @param status 待办任务和挂起任务状态
	 * @return 分页数据
	 */
	public Pager searchMyTaskRecordPage(Pager page, Long userId, String status) throws BaseException;
	
	/**
	 * 根据参数获取工作流中我的待办任务或者挂起任务,暂时只有待办管理使用, 不根据指定当前人获取待办列表,这个列表中包括所有人的待办
	 * @param page 当前页,每页数量,起始索引
	 * @param userId 用户ID  (传递可以,但是在真正查询的时候不用)
	 * @param status 待办任务和挂起任务状态
	 * @return 分页数据
	 */
	public Pager searchTaskRecordManagePage(Pager page, Long userId, String status) throws BaseException;
	
	/**
	 * 根据用主键及分页参数获取工作流中我的办结任务
	 * @param page 当前页,每页数量,起始索引
	 * @param userId 用户ID
	 * @return 分页数据
	 */
	public Pager searchMyTaskWJPage(Pager page, Long userId) throws BaseException;
	
	/**
	 * 获取流程当前节点及之前所有信息
	 * @param processDefinitionId 流程定义主键
	 * @param processInstanceId 流程实例主键
	 * @param taskId 任务主键
	 * @param originTaskId 原始任务ID
	 * @throws BaseException
	 */
	public List<FlowTaskInfoVO> searchFlowTaskVOInfoList(String processDefinitionId, String processInstanceId, String taskId, String originTaskId, boolean nextTaskTip) throws BaseException;
	
	
	/**
	 * 加签处理
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param toUsrIds 加签处理人
	 * @throws BaseException
	 */
	public DataResultDTO modifyFlowSign(SysFlowTaskHVO entity) throws BaseException;
	
	/**
	 * 签收
	 * @param usrId 用户ID 既是签收人
	 * @param taskId 任务ID
	 * @throws BaseException
	 */
	public Boolean modifyFlowPrivate(SysFlowTaskHVO sysFlowTaskHVO) throws BaseException;
	
	/**
	 * 流程完成操作,可能是提交可能是不通过, 根据动态生成的按钮判断
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param flowKey 流程key,需要返回给工作流接口,接口需要知道是走哪条路线
	 * @param processDefinitionKey 流程定义标识
	 * @param taskDefKey 任务定义标识
	 * @throws BaseException
	 */
	public DataResultDTO modifyFlowComplete(FlowCompleteParamsDTO flowCompleteParamsDTO) throws BaseException;
	
	/**
	 * 流程分配
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param toUsrIds 流程分配人
	 * @throws BaseException
	 */
	public DataResultDTO modifyFlowDistribute(SysFlowTaskHVO sysFlowTaskHVO) throws BaseException;
	
	/**
	 * 流程暂不处理(挂起)
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param processInstanceId 流程实例ID
	 * @throws BaseException
	 */
	public DataResultDTO modifyFlowHold(SysFlowTaskHVO sysFlowTaskHVO) throws BaseException;
	
	/**
	 * 流程恢复操作
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param processInstanceId 流程实例ID
	 * @throws BaseException
	 */
	public Boolean modifyFlowRecover(Long usrId, String taskId , String processInstanceId) throws BaseException;

	/**
	 * 流程作废操作
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @param processInstanceId 流程实例ID
	 * @throws BaseException
	 */
	public Boolean modifyFlowCancel(Long usrId, String taskId , String processInstanceId) throws BaseException;
	
	/**
	 * 流程驳回
	 * @param usrId 用户ID
	 * @param taskId 任务ID
	 * @throws BaseException
	 */
	public Boolean modifyFlowRefused(Long usrId, String taskId) throws BaseException;
	
	/**
	 * 同步工作流引擎-流程定义数据
	 * 调用工作流引擎接口获取数据后把数据整合到本地DB中,供给流程配置使用
	 * @throws BaseException
	 */
	public Boolean syncFlowDefDataFromRemote(String sysCd) throws BaseException;
	
	/**
	 * 获取当前代办人设置列表
	 * @param usrId
	 * @param page
	 * @return
	 */
	public Pager searchFlowAgentUsrListPage(Long usrId, Pager page);
	
	/**
	 * 新增流程代办人
	 * @param sysFlowAgentUsrVO
	 * @return Boolean
	 */
	public Boolean addFlowAgentUsr(SysFlowAgentUsrVO sysFlowAgentUsrVO);
	
	/**
	 * 删除流程代办人
	 * @param dataId 流程引擎中流程代办人ID
	 * @return Boolean
	 */
	public Boolean removeFlowAgentUsr(String dataId);
	
    /**
     * 任务源集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchBusinessSourceList() throws BaseException;
    
    /**
     * 事业部集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchBusinessOrgList() throws BaseException;
    
    /**
     * 业务类型集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchBusinessTypeList() throws BaseException;
    
    /**
     * 流程驳回原因
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchRejRsnList() throws BaseException;
	
    /**
     * 查询自己可以使用的流程定义集合
     * @param usrId 用户ID
     * @param orgId 组织架构ID
     * @param sysCd 系统代码
     * @param isAuth 是否加入权限
     * @return
     * @throws BaseException
     */
    public List<KeyValueVO> searchFlowAllowMe(Long usrId, Long orgId, String sysCd, int isAuth) throws BaseException;
    
    /**
     * 流程关联组织架构关系中业务类型数据
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchModelTypList() throws BaseException;
    
    /**
     * 加入流程附件
     * @return
     * @throws BaseException
     */
    public Boolean addFlowAttchmnt(Long id, String attchmnt, FlowCompleteParamsDTO flowCompleteParamsDTO)throws BaseException;
    
    /**
     * 查询可以启动的流程版本信息
     * 主要参数：1、系统代码  2、是否删除标记(不填默认为否) 3、是否有效(不填默认有效) 4、业务类型 5、组织架构代码
     * @param condition
     * @return
     * @throws BaseException
     */
    public List<SysFlowManageVVO> searchFlowManageVListForStart(SysFlowManageVQueryCondition condition) throws BaseException;
    
    /**
	 * 根据角色,业务ID,流程定义标识获取受理人员数据
	 * 首先根据角色获取角色下所有人,然后到功能权限下判断是否有数据,如果有则获取人员所对应的组织架构
	 * 根据业务数据主键标识获取当前项目,项目经理所在的组织架构代码
	 * 最后把包含在项目经理所在的组织架构代码中的人员返回-逐级查询拿到上级为止-查到一级后不会在往上级找
	 * @param roleId 角色
	 * @param processDefKey 流程定义标识
	 * @param taskDefKey 任务定义Key
	 * @param businessKey 业务数据主键
	 * @param beanName 自定义bean 名字
	 * @param sysCd 系统代码
	 * @return 符合条件的人员集合
	 * @throws BaseException
	 */
	public List<SysUsrFunAuthRDTO> searchAgentUsrByRole(Long roleId, String processDefKey, String taskDefKey, Long businessKey, String beanName, String sysCd) throws BaseException; 
    
	/**
	 * 流程接口回调接口,主要用于数据回填操作或者验证操作
	 * @param processDefinitionKey 流程定义标识
	 * @param taskDefKey 任务定义标识
	 * @param businessKey 业务数据主键标识
	 * @param businessType 业务类型
	 * @return
	 * @throws BaseException
	 */
	//public String modifyFlowBack(FlowCompleteParamsDTO flowCompleteParamsDTO) throws BaseException;
	
	/**
	 * 重新设置任务处理人
	 * @param taskId 任务ID
	 * @param usrIds 用户ID 集合
	 * @param originalTaskId 原始任务ID
	 * @throws BaseException
	 */
	public Boolean modifyAssignTask(String taskId,List<String> usrIdList, String originalTaskId) throws BaseException;

	/**
	 * 变更发起人
	 * @param processInstanceId
	 * @param usrId
	 * @param usrName
	 * @return
	 * @throws BaseException
	 */
	public Boolean modifyInitiator(String processInstanceId, String usrId, String usrName) throws BaseException;
	
	/**
	 * 批量变更启动人
	 * @param 批量变更启动人
	 * @return
	 * @throws BaseException
	 */
	public DataResultDTO batchModifyInitiator(List<FlowProcessDTO> processes) throws BaseException;
	
	/**
	 * 流程节点系统自动处理通用方法
	 * @param flowCompleteParamsDTO
	 * @throws BaseException
	 */
	//public DataResultDTO modifyRobotFlowBack(FlowCompleteParamsDTO flowCompleteParamsDTO) throws BaseException;
	/**
	 * 获取下一节点操作人
	 * @param key
	 * @return
	 * @throws BaseException
	 */
	public String getNextFlowAssignee(String key) throws BaseException;

	/**
	 * @MethodName batchModifyAssignTask
	 * @Description: 批量设置处理人
	 * @Author: wangpengtao@lionbridgecapital.cn
	 * @CreateDate: 2020/1/4 13:26
	 * @Version: V1.0.0
	 * @Param taskIds
	 * @Param usrId
	 * @Param rlName
	 * @Return java.lang.Boolean
	 * @UpdateRemark [序号][YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	public Boolean batchModifyAssignTask(List<String> taskIds, String usrId, String rlName) throws BaseException;

	/**
	 * @MethodName modifyInitiator
	 * @Description: 批量变更发起人
	 * @Author: wangpengtao@lionbridgecapital.cn
	 * @CreateDate: 2020/1/4 13:27
	 * @Version: V1.0.0
	 * @Param processInstanceIds
	 * @Param usrId
	 * @Param rlName
	 * @Return java.lang.Boolean
	 * @UpdateRemark [序号][YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	public Boolean batchModifyInitiator(List<String> processInstanceIds, String usrId, String rlName) throws BaseException ;


}
